package com.king.freefish.common.util;

import lombok.*;
import lombok.experimental.Accessors;

import java.io.Serializable;

/**
 * @packageName com.king.freefish.online.common.util
 * @author: jinguoguang
 * @date: 2025/7/29 15:00
 * @description:
 **/
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class R<T> implements Serializable {

    /**
     * 成功标记
     */
    public static final Integer SUCCESS = 0;

    /**
     * 失败标记
     */
    public static final Integer FAIL = 1;

    /**
     * 序列号
     */
    private static final long serialVersionUID = 1L;

    /**
     * 状态码
     */
    @Getter
    @Setter
    private int code;

    /**
     * 提示信息
     */
    @Getter
    @Setter
    private String message;

    /**
     * 结果数据
     */
    @Getter
    @Setter
    private T data;

    /**
     * 响应状态成功无数据结果
     *
     * @param <T> 数据格式
     * @return 结果信息
     */
    public static <T> R<T> ok() {
        return buildResult(null, SUCCESS, null);
    }

    /**
     * 响应状态成功结果数据
     *
     * @param data 结果数据
     * @param <T>  数据格式
     * @return 成功结果数据
     */
    public static <T> R<T> ok(T data) {
        return buildResult(data, SUCCESS, null);
    }

    /**
     * 响应状态成功结果数据及提示信息
     *
     * @param data 结果数据
     * @param msg  提示信息
     * @param <T>  数据格式
     * @return 结果信息
     */
    public static <T> R<T> ok(T data, String msg) {
        return buildResult(data, SUCCESS, msg);
    }

    /**
     * 响应失败结果
     *
     * @param <T> 数据格式
     * @return 结果信息
     */
    public static <T> R<T> failed() {
        return buildResult(null, FAIL, null);
    }

    /**
     * 响应失败带提示信息结果数据
     *
     * @param msg 提示信息
     * @param <T> 数据格式
     * @return 结果信息
     */
    public static <T> R<T> failedMsg(String msg) {
        return buildResult(null, FAIL, msg);
    }

    /**
     * 响应失败 带code及提示信息
     *
     * @param code 错误码
     * @param msg  响应信息
     * @param <T>  数据格式
     * @return 结果信息
     */
    public static <T> R<T> failedMsg(int code, String msg) {
        return buildResult(null, code, msg);
    }

    /**
     * 响应失败带结果数据
     *
     * @param data 结果数据
     * @param <T>  数据格式
     * @return 结果信息
     */
    public static <T> R<T> failed(T data) {
        return buildResult(data, FAIL, null);
    }

    /**
     * 响应失败且带提示信息及数据
     *
     * @param data 结果数据
     * @param msg  提示信息
     * @param <T>  数据格式
     * @return 失败结果信息
     */
    public static <T> R<T> failed(T data, String msg) {
        return buildResult(data, FAIL, msg);
    }

    /**
     * 构建结果数据
     *
     * @param data 数据
     * @param code 状态码
     * @param msg  提示信息
     * @param <T>  数据格式
     * @return 结果数据
     */
    public static <T> R<T> result(T data, int code, String msg) {
        return buildResult(data, code, msg);
    }

    /**
     * 构建结果信息
     *
     * @param data 数据
     * @param code 状态码
     * @param msg  提示信息
     * @param <T>  数据格式
     * @return 结果数据
     */
    public static <T> R<T> buildResult(T data, int code, String msg) {
        //创建结果
        R<T> apiResult = new R<>();
        //设置状态码
        apiResult.setCode(code);
        //设置数据
        apiResult.setData(data);
        //设置提示信息
        apiResult.setMessage(msg);
        return apiResult;
    }

    /**
     * 结果是否成功状态
     *
     * @return true是 false 否
     */
    public Boolean isSuccess() {
        return (this.code == SUCCESS);
    }
}